1 Test 1 : utilisation des algorithmes de Déformation Temporelle Dynamique

J’ai ici appliqué les algorithmes Dynamic Time Warping (DTW) qui permettent de calculer des distances entre deux séries temporelles qui n’ont pas la même longueur. Je pense que ça ne s’adapte pas vraiment dans noter cas mais je voulais tester. L’idée de cet algorithme est de regarder les similarités entre les séries temporelles en prenant en compte les éventuels décalages temporels (i.e. : \(X_t\) et \(X_{t-1}\) représente la même série, juste décalée dans le temps, non pris en compte par distance euclidienne) et les différences de longueur (deux coureurs qui courent de la même façon mais pas à la même vitesse). En plus ça n’a pas trop l’air de marcher puisqu’il faut que les deux séries soient de même longueur j’ai l’impression

modeles <- ts(read.csv("../../data_bis/modeles.csv", sep=";")[,-1],
              start = 2011,frequency = 12)
data <- readRDS("../../data_bis/donnes_cam.RDS")
indices_mensuels_baseline <- read.csv("../../data_bis/indices_mensuels_baseline.csv",
                                      sep=";")[,-c(1:2)]
indices_mensuels_baseline <- ts(indices_mensuels_baseline, start = 2011, frequency = 12)
modeles <- ts.union(modeles,indices_mensuels_baseline)
colnames(modeles) <- gsub(".*\\.", "", colnames(modeles))

data[,"Indicateur synthétique"] <- scale(data[,"Indicateur synthétique"] )
data_lag <- lag(data, -1)

library(dtw)
distance_brut <- sapply(1:ncol(modeles), function(i){
    dtw((modeles[,i]),
        window(data[,"ind_synt_brut"], start = start(modeles), end = end(modeles)),
        keep=TRUE)$distance
}
)

distance_cvs <- sapply(1:ncol(modeles), function(i){
    dtw((modeles[,i]),
        window(data[,"Indicateur synthétique"], start = start(modeles), end = end(modeles)),
        keep=TRUE)$distance
}
)
data.frame(distance_brut, distance_cvs,
           row.names = colnames(modeles))
##                   distance_brut distance_cvs
## reg_log_rmsw_z         140.3115     143.1465
## reg_log_rmsw_lf        133.4384     137.4707
## reg_log_nrmsw_z        140.7268     143.3803
## reg_log_nrmsw_lf       146.6047     148.4010
## reg_prob_rmsw_z        133.0967     137.7387
## reg_prob_rmsw_lf       133.4384     137.4707
## reg_prob_nrmsw_z       134.6974     138.6569
## reg_prob_nrmsw_lf      135.7914     138.9965
## git                    142.0631     143.4270
## sncf                   140.1650     142.0068

Et si on renormalise :

distance_brut_norm <- sapply(1:ncol(modeles), function(i){
    dtw(scale(modeles[,i]),
        scale(window(data[,"ind_synt_brut"],
               start = start(modeles), end = end(modeles))),
        keep=TRUE)$distance
}
)

distance_cvs_norm <- sapply(1:ncol(modeles), function(i){
    dtw(scale(modeles[,i]),
        scale(window(data[,"Indicateur synthétique"],
               start = start(modeles), end = end(modeles))),
        keep=TRUE)$distance
}
)
data.frame(distance_brut_norm, distance_cvs_norm,
           row.names = colnames(modeles))
##                   distance_brut_norm distance_cvs_norm
## reg_log_rmsw_z              102.1255         102.96179
## reg_log_rmsw_lf             102.6441         104.26242
## reg_log_nrmsw_z             105.4732         103.45965
## reg_log_nrmsw_lf            103.4784         101.52535
## reg_prob_rmsw_z             104.8295         106.19551
## reg_prob_rmsw_lf            102.6441         104.26242
## reg_prob_nrmsw_z            105.0122         103.19343
## reg_prob_nrmsw_lf           102.8251         101.47072
## git                         102.2669         103.09860
## sncf                         87.0505          89.60869

Pour rappel, on retient l’indicateur reg_log_nrmsw_lf.

ind_retenu <- "reg_log_nrmsw_lf"

Notre indicateur n’est pas forcément celui qui minimise la distance mais toutes les distances sont proches : on voit en fait que tous les indicateurs sont proches, sauf la baseline SNCF.

Voir : http://dtw.r-forge.r-project.org

https://en.wikipedia.org/wiki/Dynamic_time_warping

https://towardsdatascience.com/dynamic-time-warping-3933f25fcdd

2 Test 2 : renormaliser or not renormaliser ? That is the question

Quand on regarde nos indicateurs de sentiment bruts, il est clair qu’il y a des différences en niveau. Ce qui est étonnant c’est que pour la majorité des indicateurs on a toujours des tweets qui sont globalement positifs (ici c’est bien entre -1 et 1).

AQLTools::hc_stocks(2*(modeles)-1,digits = 2)

En revanche quand on renormalise toutes les séries sont extrêmement proches, on retrouve ce qu’on a vu dans la partie précédente. Je trouve que ça milite pour renormaliser les séries : la moyenne et l’écart-type de l’indicateur Camme n’a pas de sens (série calculée à partir des soldes d’opinion renormalisés, on force l’indicateur à être de moyenne 100 et d’écart-type 10) et nos différents modèles représentent les mêmes phénomènes économiques. Si vous préférez on peut toujours faire une moyenne de 100 et d’écart-type 10 pour tout.

AQLTools::hc_stocks(scale(modeles),digits = 2)

La baseline de la sncf est quand même à part

3 Test 3 : saisonnalité et JO

Quand on parle d’effets jours-ouvrables on distingue trois type d’effet :

  • un effet longueur de mois (les mois n’ont pas la même longueur)

  • un effet type de jour : les ventes sont généralement plus importantes le samedi que le lundi. Pour simplifier le modèle on considère parfois parfois un effet jour de la semaine vs week-end (sous entendu un lundi a le même effet qu’un mardi… jusqu’à vendredi mais pas le même effet qu’un samedi, qui a le même effet qu’un dimanche et qu’un jour ferié) : c’est ce qu’on appelle working days. Dans le cas où on distingue tous les jours de la semaine on parle de trading days.

  • un effet “fêtes mobiles”, souvent ce qu’on appel un effet “graduel de Pâques”. En fait Pâques ne tombe pas le même jour chaque année et Pâques a un effet certain sur la vente de chocolat. En revanche les achats de chocolat ne se font pas le jour de mais les jours avant : c’est l’effet graduel. En fonction du jour de Pâques cet effet graduel peut être sur deux mois. Pour les autres fêtes comme Noël cet effet graduel est pris en compte dans la saisonnalité

Dans notre cas on n’aura pas d’effet longueur de mois, sûrement pas d’effet fête mobile mais on peut avoir un effet type de jour.

On pourrait avoir un effet saisonnier : les tweets sont plus négatifs en hiver qu’en été. Pour tester la saisonnalité on peut faire plusieurs tests (voir https://jdemetradocumentation.github.io/JDemetra-documentation/pages/theory/Tests.html).

serie <- modeles[,ind_retenu]
serie <- ts(scale(serie),
            start = start(serie),
            frequency = 12)
jd2_seasonality_Friedman(serie) # test s'il y a une saisonnalité stable
## [1] 25.602451839  0.007433692
## attr(,"description")
## [1] "Chi2 with 11 degrees of freedom "
jd2_seasonality_KruskalWallis(serie) # pas de saisonnalité
## [1] 5.3987597 0.9103291
## attr(,"description")
## [1] "Chi2 with 11 degrees of freedom "
jd2_seasonality_FTest(serie) # présence de saisonnalité
## [1] 3.061297450 0.001767486
## attr(,"description")
## [1] "F with 11 degrees of freedom in the nominator and 82 degrees of freedom in the denominator"
jd2_seasonality_QSTest(serie) # pas de saisonnalité
## [1] 4.83971151 0.08893444
## attr(,"description")
## [1] "Chi2 with 2 degrees of freedom "

Ici les résultats sont mitigés :

  • le test de Friedman nous dit que si il y a une saisonnalité alors il y a une saisonnalité stable. S’il n’y a pas de saisonnalité alors ce test va conclure à une saisonnalité stable (tout le temps égal à 0)

  • Kruskal-Wallis et QS concluent à pas de saisonnalité

  • le Ftest conclue à une saisonnalité : de manière schématique, pour ce test on fait une régression en ajoutant une indicatrice pour chaque mois et on teste si l’ensemble des coefficients sont nuls.

Cependant plusieurs indicateurs nous semblent indiquer qu’il n’y a pas de saisonnalité marquée. Tout d’abord quand on trace les séries par mois on ne voit pas de d’évolution différente entre les mois.

AQLTools::graph_ts(serie,
                   diviserParPeriode = TRUE,
                   n_ylabel = 4, y_lab = NULL)

Quand on fait une désaisonnalisation, le modèle ARIMA qui est retenu est \(ARIMA(0,1,1)(0,0,0)\) avec aucun ordre saisonnier :

mod <- x13(serie)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Par ailleurs, même si il y a une saisonnalité identifiable, c’est la composante saisonnière qui contribue le moins à la variance de la série.

mod$diagnostics$combined_test
## Non parametric tests for stable seasonality
##                                                          P.value
##   Kruskall-Wallis test                                      0.001
##   Test for the presence of seasonality assuming stability   0.000
##   Evolutive seasonality test                                0.422
## 
## Identifiable seasonality probably present
mod$diagnostics$variance_decomposition
##            Component
## Cycle      79.342875
## Seasonal    6.243428
## Irregular  16.139834
## TD & Hol.   0.000000
## Others      0.000000
## Total     101.726137

Si on trace les coefficients saisonniers par mois, même si on voit des différences c’est très faible et il y a beaucoup de bruit.

plot(mod$decomposition)

On n’observe pas d’effet jours ouvrables (on n’observe pas de régresseur), que ce soit en trading days :

spec <- x13_spec("RSA5c",
                 easter.enabled = FALSE,
                 tradingdays.leapyear = "None")
mod <- x13(serie, spec = spec)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Qu’en working days :

spec <- x13_spec("RSA4c",
                 easter.enabled = FALSE,
                 tradingdays.leapyear = "None")
mod <- x13(serie, spec = spec)
mod$regarima
## y = regression model + arima (0, 1, 1, 0, 0, 0)
## Log-transformation: no
## Coefficients:
##          Estimate Std. Error
## Theta(1)   -0.495       0.09
## 
## 
## Residual standard error: 0.3424 on 93 degrees of freedom
## Log likelihood = -33.11, aic = 70.22 aicc = 70.35, bic(corrected for length) = -2.096

Bilan : pas d’effet JO, éventuellement une saisonnalité mais je ne suis pas convaincu.

Sur l’enquête Camme on voit aussi qu’il y a très peu de différences entre l’indicateur brut et CVS :

AQLTools::hc_stocks(scale(data[,1:2]),digits = 2)

4 Etude des corrélations

4.1 En niveau ou en différence

donnes_calcul <- scale(ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data))
donnes_calcul_lag <- scale(ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data_lag))
colnames(donnes_calcul) <- 
    colnames(donnes_calcul_lag) <- 
    c("Ind_sent","Baseline_git","Baseline_sncf", "ind_synt_brut", "ind_synt_cvs",
      "niv_vie_pas", "niv_vie_fut",
      "chom_evol","oppor_achat", "epargne_actuelle",
      "sit_fin_pas", "sit_fin_fut","cap_fut"
    )
dataGraph <- ts.intersect(modeles[,c(ind_retenu, "git", "sncf")], data[,1:2], data_lag[,1:2])
colnames(dataGraph) <- c("Indicateur sentiment",
                         "Baseline Git", "Baseline SNCF", 
                         "Camme_Brut", "Camme_CVS",
                         "Camme_Brut retardé", "Camme_CVS retardé")
AQLTools::hc_stocks(scale(dataGraph),digits = 2)

On va plutôt étudier l’indicateur retardé. Il y a une tendance dans les deux séries : quand on regarde les corrélations il y a donc une corrélation falacieuse (on trouve une corrélation significative). La présence d’une racine unitaire est confirmée par le test de Philips-Perron et le test KPSS :

PP.test(donnes_calcul_lag[,"Ind_sent"])
## 
##  Phillips-Perron Unit Root Test
## 
## data:  donnes_calcul_lag[, "Ind_sent"]
## Dickey-Fuller = -2.3493, Truncation lag parameter = 3, p-value = 0.4321
tseries::kpss.test(donnes_calcul_lag[,"Ind_sent"])
## 
##  KPSS Test for Level Stationarity
## 
## data:  donnes_calcul_lag[, "Ind_sent"]
## KPSS Level = 1.4805, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(donnes_calcul_lag[,"Ind_sent"],1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(donnes_calcul_lag[, "Ind_sent"], 1)
## Dickey-Fuller = -18.027, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(donnes_calcul_lag[,"Ind_sent"],1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(donnes_calcul_lag[, "Ind_sent"], 1)
## KPSS Level = 0.18522, Truncation lag parameter = 3, p-value = 0.1
PP.test(donnes_calcul_lag[,"ind_synt_brut"])
## 
##  Phillips-Perron Unit Root Test
## 
## data:  donnes_calcul_lag[, "ind_synt_brut"]
## Dickey-Fuller = -2.2432, Truncation lag parameter = 3, p-value = 0.4759
tseries::kpss.test(donnes_calcul_lag[,"ind_synt_brut"])
## 
##  KPSS Test for Level Stationarity
## 
## data:  donnes_calcul_lag[, "ind_synt_brut"]
## KPSS Level = 1.8588, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(donnes_calcul_lag[,"ind_synt_brut"],1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_brut"], 1)
## Dickey-Fuller = -8.6109, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(donnes_calcul_lag[,"ind_synt_brut"],1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_brut"], 1)
## KPSS Level = 0.11681, Truncation lag parameter = 3, p-value = 0.1
PP.test(donnes_calcul_lag[,"ind_synt_cvs"])
## 
##  Phillips-Perron Unit Root Test
## 
## data:  donnes_calcul_lag[, "ind_synt_cvs"]
## Dickey-Fuller = -2.2125, Truncation lag parameter = 3, p-value = 0.4886
tseries::kpss.test(donnes_calcul_lag[,"ind_synt_cvs"])
## 
##  KPSS Test for Level Stationarity
## 
## data:  donnes_calcul_lag[, "ind_synt_cvs"]
## KPSS Level = 1.888, Truncation lag parameter = 3, p-value = 0.01
PP.test(diff(donnes_calcul_lag[,"ind_synt_cvs"],1))
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_cvs"], 1)
## Dickey-Fuller = -9.4443, Truncation lag parameter = 3, p-value = 0.01
tseries::kpss.test(diff(donnes_calcul_lag[,"ind_synt_cvs"],1))
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(donnes_calcul_lag[, "ind_synt_cvs"], 1)
## KPSS Level = 0.13961, Truncation lag parameter = 3, p-value = 0.1

Il y a donc présence d’une tendance stochastique. On peut faire un test de cointégration pour voir si les séries partagent la même tendance stochastique : ce n’est pas le cas.

aTSA::coint.test(donnes_calcul_lag[,"Ind_sent"], donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: donnes_calcul_lag[, "Ind_sent"] 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.11    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.06    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000  -0.812   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(donnes_calcul_lag[,"Ind_sent"], donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: donnes_calcul_lag[, "Ind_sent"] 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.18    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##     3.0    -1.0     0.1 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000  -0.869   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

Il n’y a aucune des deux séries qui Granger Cause, je pense qu’il faut uniquement regarder le test en différence mais je laisse en niveau quand même pour info. En comparant à l’indicateur Camme CVS pas de causalité au sens de Granger

library(lmtest)
grangertest(donnes_calcul[, "Ind_sent"], donnes_calcul[, "ind_synt_cvs"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "ind_synt_cvs"] ~ Lags(donnes_calcul[, "ind_synt_cvs"], 1:1) + Lags(donnes_calcul[, "Ind_sent"], 1:1)
## Model 2: donnes_calcul[, "ind_synt_cvs"] ~ Lags(donnes_calcul[, "ind_synt_cvs"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.9366 0.3357
grangertest(donnes_calcul[, "ind_synt_cvs"], donnes_calcul[, "Ind_sent"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "Ind_sent"] ~ Lags(donnes_calcul[, "Ind_sent"], 1:1) + Lags(donnes_calcul[, "ind_synt_cvs"], 1:1)
## Model 2: donnes_calcul[, "Ind_sent"] ~ Lags(donnes_calcul[, "Ind_sent"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.0909 0.7637
grangertest(diff(donnes_calcul[, "Ind_sent"]), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 2.3687 0.1273
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(donnes_calcul[, "Ind_sent"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Ind_sent"]) ~ Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(donnes_calcul[, "Ind_sent"]) ~ Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 1.7004 0.1955

En comparant à l’indicateur Camme brut, on observe une causalité à 5 % : note indicateur cause instannément au sens de Granger l’indicateur Brut de l’enquête Camme (non retardé).

grangertest(donnes_calcul[, "Ind_sent"], donnes_calcul[, "ind_synt_brut"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "ind_synt_brut"] ~ Lags(donnes_calcul[, "ind_synt_brut"], 1:1) + Lags(donnes_calcul[, "Ind_sent"], 1:1)
## Model 2: donnes_calcul[, "ind_synt_brut"] ~ Lags(donnes_calcul[, "ind_synt_brut"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.1764 0.6755
grangertest(donnes_calcul[, "ind_synt_brut"], donnes_calcul[, "Ind_sent"], order = 1)
## Granger causality test
## 
## Model 1: donnes_calcul[, "Ind_sent"] ~ Lags(donnes_calcul[, "Ind_sent"], 1:1) + Lags(donnes_calcul[, "ind_synt_brut"], 1:1)
## Model 2: donnes_calcul[, "Ind_sent"] ~ Lags(donnes_calcul[, "Ind_sent"], 1:1)
##   Res.Df Df      F Pr(>F)
## 1     92                 
## 2     93 -1 0.1191 0.7308
grangertest(diff(donnes_calcul[, "Ind_sent"]), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df      F  Pr(>F)  
## 1     91                    
## 2     92 -1 6.5803 0.01195 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(donnes_calcul[, "Ind_sent"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Ind_sent"]) ~ Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(donnes_calcul[, "Ind_sent"]) ~ Lags(diff(donnes_calcul[, "Ind_sent"]), 1:1)
##   Res.Df Df  F Pr(>F)
## 1     91             
## 2     92 -1  0 0.9967

Quand on prend l’indicateur Camme retardé, on trouve que l’indicateur Camme brut granger cause notre indicateur au seuil de 10 %.

grangertest(diff(donnes_calcul_lag[, "ind_synt_brut"]), diff(donnes_calcul_lag[, "Ind_sent"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul_lag[, "Ind_sent"]) ~ Lags(diff(donnes_calcul_lag[, "Ind_sent"]), 1:1) + Lags(diff(donnes_calcul_lag[, "ind_synt_brut"]), 1:1)
## Model 2: diff(donnes_calcul_lag[, "Ind_sent"]) ~ Lags(diff(donnes_calcul_lag[, "Ind_sent"]), 1:1)
##   Res.Df Df      F  Pr(>F)  
## 1     91                    
## 2     92 -1 3.5984 0.06101 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Bilan notre indicateur de sentiment permettrait de prévoir l’enquête Camme.

Quand on regarde les séries en différence on ne remarque… rien. On ne comprend pas pourquoi les baselines semblent plus proches selon les corrélations (voir plus bas).

AQLTools::hc_stocks(diff(donnes_calcul_lag[,1:5]),digits = 2)

4.1.1 Test sur baseline git

Pas de causalité au sens de Granger :

grangertest(diff(donnes_calcul[, "Baseline_git"]), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.8216 0.3671
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(donnes_calcul[, "Baseline_git"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Baseline_git"]) ~ Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(donnes_calcul[, "Baseline_git"]) ~ Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 2.7184 0.1026
grangertest(diff(donnes_calcul[, "Baseline_git"]), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 1.0331 0.3121
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(donnes_calcul[, "Baseline_git"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Baseline_git"]) ~ Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(donnes_calcul[, "Baseline_git"]) ~ Lags(diff(donnes_calcul[, "Baseline_git"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 1.0279 0.3133

Ni de cointégration :

aTSA::coint.test(donnes_calcul_lag[,"Baseline_git"], donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_git"] 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.12    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##   3.000  -0.853   0.100 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##    3.00   -1.02    0.10 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(donnes_calcul_lag[,"Baseline_git"], donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_git"] 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.16    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##   3.000  -0.802   0.100 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##     3.0    -1.1     0.1 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

4.1.2 Test sur baseline sncf

Pas de causalité au sens de Granger :

grangertest(diff(donnes_calcul[, "Baseline_sncf"]), diff(donnes_calcul[, "ind_synt_cvs"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1) + Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_cvs"]) ~ Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.0192 0.8901
grangertest(diff(donnes_calcul[, "ind_synt_cvs"]), diff(donnes_calcul[, "Baseline_sncf"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Baseline_sncf"]) ~ Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_cvs"]), 1:1)
## Model 2: diff(donnes_calcul[, "Baseline_sncf"]) ~ Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1)
##   Res.Df Df     F Pr(>F)
## 1     91                
## 2     92 -1 0.003 0.9562
grangertest(diff(donnes_calcul[, "Baseline_sncf"]), diff(donnes_calcul[, "ind_synt_brut"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1) + Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1)
## Model 2: diff(donnes_calcul[, "ind_synt_brut"]) ~ Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.6176  0.434
grangertest(diff(donnes_calcul[, "ind_synt_brut"]), diff(donnes_calcul[, "Baseline_sncf"]), order = 1)
## Granger causality test
## 
## Model 1: diff(donnes_calcul[, "Baseline_sncf"]) ~ Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1) + Lags(diff(donnes_calcul[, "ind_synt_brut"]), 1:1)
## Model 2: diff(donnes_calcul[, "Baseline_sncf"]) ~ Lags(diff(donnes_calcul[, "Baseline_sncf"]), 1:1)
##   Res.Df Df      F Pr(>F)
## 1     91                 
## 2     92 -1 0.0624 0.8033

Ni de cointégration :

aTSA::coint.test(donnes_calcul_lag[,"Baseline_sncf"], donnes_calcul_lag[,"ind_synt_brut"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_sncf"] 
## Input: donnes_calcul_lag[, "ind_synt_brut"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##     3.0    -2.2     0.1 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.32    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000   0.769   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10
aTSA::coint.test(donnes_calcul_lag[,"Baseline_sncf"], donnes_calcul_lag[,"ind_synt_cvs"],d = 0)
## Response: donnes_calcul_lag[, "Baseline_sncf"] 
## Input: donnes_calcul_lag[, "ind_synt_cvs"] 
## Number of inputs: 1 
## Model: y ~ X + 1 
## ------------------------------- 
## Engle-Granger Cointegration Test 
## alternative: cointegrated 
## 
## Type 1: no trend 
##     lag      EG p.value 
##    3.00   -2.19    0.10 
## ----- 
##  Type 2: linear trend 
##     lag      EG p.value 
##    3.00   -1.28    0.10 
## ----- 
##  Type 3: quadratic trend 
##     lag      EG p.value 
##   3.000   0.716   0.100 
## ----------- 
## Note: p.value = 0.01 means p.value <= 0.01 
##     : p.value = 0.10 means p.value >= 0.10

4.2 Etude des corrélations

Spoiler alert aucune corrélation significative. Pas de différence quand on regarde les séries retardées.

4.2.1 Pearson

library(corrplot)
library(Hmisc)
M <- rcorr(diff(donnes_calcul), type = "pearson")
M_lag <- rcorr(diff(donnes_calcul), type = "pearson")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.430           0.430        0.054               0.054
## ind_synt_brut       0.578           0.578        0.637               0.637
## ind_synt_cvs        0.716           0.716        0.509               0.509
## niv_vie_pas         0.233           0.233        0.432               0.432
## niv_vie_fut         0.294           0.294        0.252               0.252
## chom_evol           0.424           0.424        0.749               0.749
## oppor_achat         0.119           0.119        0.337               0.337
## epargne_actuelle    0.650           0.650        0.399               0.399
## sit_fin_pas         0.245           0.245        0.472               0.472
## sit_fin_fut         0.546           0.546        0.636               0.636
## cap_fut             0.974           0.974        0.148               0.148
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.430                0.430
## Baseline_git             0.054                0.054
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.047                0.047
## ind_synt_cvs             0.017                0.017
## niv_vie_pas              0.585                0.585
## niv_vie_fut              0.000                0.000
## chom_evol                0.005                0.005
## oppor_achat              0.008                0.008
## epargne_actuelle         0.394                0.394
## sit_fin_pas              0.828                0.828
## sit_fin_fut              0.144                0.144
## cap_fut                  0.040                0.040

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.2.2 Spearman

M <- rcorr(diff(donnes_calcul), type = "spearman")
M_lag <- rcorr(diff(donnes_calcul), type = "spearman")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.439           0.439        0.064               0.064
## ind_synt_brut       0.767           0.767        0.654               0.654
## ind_synt_cvs        0.424           0.424        0.400               0.400
## niv_vie_pas         0.149           0.149        0.701               0.701
## niv_vie_fut         0.179           0.179        0.202               0.202
## chom_evol           0.861           0.861        0.891               0.891
## oppor_achat         0.059           0.059        0.129               0.129
## epargne_actuelle    0.279           0.279        0.512               0.512
## sit_fin_pas         0.280           0.280        0.927               0.927
## sit_fin_fut         0.836           0.836        0.685               0.685
## cap_fut             0.968           0.968        0.189               0.189
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.439                0.439
## Baseline_git             0.064                0.064
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.168                0.168
## ind_synt_cvs             0.079                0.079
## niv_vie_pas              0.585                0.585
## niv_vie_fut              0.001                0.001
## chom_evol                0.010                0.010
## oppor_achat              0.027                0.027
## epargne_actuelle         0.234                0.234
## sit_fin_pas              0.905                0.905
## sit_fin_fut              0.107                0.107
## cap_fut                  0.040                0.040

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.3 Etude des corrélations (séries non différenciées)

Je fais la même chose sur les séries non différenciées mais je pense qu’il ne faut pas regarder les résultats

4.3.1 Pearson

M <- rcorr(donnes_calcul, type = "pearson")
M_lag <- rcorr(donnes_calcul, type = "pearson")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.000           0.000        0.000               0.000
## ind_synt_brut       0.001           0.001        0.000               0.000
## ind_synt_cvs        0.001           0.001        0.000               0.000
## niv_vie_pas         0.000           0.000        0.000               0.000
## niv_vie_fut         0.001           0.001        0.000               0.000
## chom_evol           0.100           0.100        0.088               0.088
## oppor_achat         0.004           0.004        0.000               0.000
## epargne_actuelle    0.000           0.000        0.003               0.003
## sit_fin_pas         0.141           0.141        0.043               0.043
## sit_fin_fut         0.000           0.000        0.000               0.000
## cap_fut             0.006           0.006        0.020               0.020
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.000                0.000
## Baseline_git             0.000                0.000
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.000                0.000
## ind_synt_cvs             0.000                0.000
## niv_vie_pas              0.000                0.000
## niv_vie_fut              0.000                0.000
## chom_evol                0.000                0.000
## oppor_achat              0.000                0.000
## epargne_actuelle         0.882                0.882
## sit_fin_pas              0.001                0.001
## sit_fin_fut              0.000                0.000
## cap_fut                  0.223                0.223

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

4.3.2 Spearman

M <- rcorr(donnes_calcul, type = "spearman")
M_lag <- rcorr(donnes_calcul, type = "spearman")

Les p-values des corrélation avec notre indicateur de sentiment

table_pval <- cbind(M$P[, "Ind_sent"],
                    M_lag$P[, "Ind_sent"],
                    M$P[, "Baseline_git"],
                    M_lag$P[, "Baseline_git"],
                    M$P[, "Baseline_sncf"],
                    M_lag$P[, "Baseline_sncf"])
colnames(table_pval) <- c("Ind_sent", "Ind_sent_avance",
                          "Baseline_git", "Baseline_git_avance",
                          "Baseline_sncf", "Baseline_sncf_avance")
round(table_pval,3)
##                  Ind_sent Ind_sent_avance Baseline_git Baseline_git_avance
## Ind_sent               NA              NA        0.000               0.000
## Baseline_git        0.000           0.000           NA                  NA
## Baseline_sncf       0.000           0.000        0.000               0.000
## ind_synt_brut       0.035           0.035        0.005               0.005
## ind_synt_cvs        0.026           0.026        0.002               0.002
## niv_vie_pas         0.017           0.017        0.004               0.004
## niv_vie_fut         0.013           0.013        0.001               0.001
## chom_evol           0.317           0.317        0.280               0.280
## oppor_achat         0.170           0.170        0.015               0.015
## epargne_actuelle    0.005           0.005        0.071               0.071
## sit_fin_pas         0.883           0.883        0.112               0.112
## sit_fin_fut         0.006           0.006        0.000               0.000
## cap_fut             0.029           0.029        0.113               0.113
##                  Baseline_sncf Baseline_sncf_avance
## Ind_sent                 0.000                0.000
## Baseline_git             0.000                0.000
## Baseline_sncf               NA                   NA
## ind_synt_brut            0.000                0.000
## ind_synt_cvs             0.000                0.000
## niv_vie_pas              0.000                0.000
## niv_vie_fut              0.000                0.000
## chom_evol                0.000                0.000
## oppor_achat              0.000                0.000
## epargne_actuelle         0.931                0.931
## sit_fin_pas              0.000                0.000
## sit_fin_fut              0.000                0.000
## cap_fut                  0.450                0.450

Série sans retard :

corrplot(M$r, method = "number")

corrplot(M$r, method = "ellipse")

Séries retardées :

corrplot(M_lag$r, method = "number")

corrplot(M_lag$r, method = "ellipse")

5 Etude de l’indicateur Camme

Pour essayer de comprendre les évolutions de l’enquête Camme, on peut regarder les contributions de chaque solde à son évolution. C’est pas très lisible mais au cas où :

6 Recherche des événements

J’ai rien trouvé mais j’ai pas tout cherché, j’ai fait une petite recherche des événements. Ma méthodologie : si il y a quelque choses que je pense venir d’un événement, je regarde les tweets, ctrl+F pour voir si je trouve beaucoup d’occurences. Généralement rien. Je n’ai pas mis tous les événements sportifs.